package handlers

import (
	"ai-collections/pkg/models"
	"net/http"

	"github.com/gin-gonic/gin"
)

var configService *models.ConfigService

// SetConfigService 设置配置服务实例
func SetConfigService(service *models.ConfigService) {
	configService = service
}

// ConfigResponse 配置接口响应
type ConfigResponse struct {
	Success bool   `json:"success"`
	Error   string `json:"error,omitempty"`
}

// GetConfigHandler 处理获取系统配置请求
func GetConfigHandler(c *gin.Context) {
	// 检查是否为管理员
	if !isOwner(c) {
		c.JSON(http.StatusForbidden, ConfigResponse{
			Success: false,
			Error:   "无权限访问",
		})
		return
	}

	// 获取配置
	if configService == nil {
		c.JSON(http.StatusInternalServerError, ConfigResponse{
			Success: false,
			Error:   "配置服务未初始化",
		})
		return
	}

	config := configService.GetConfig()
	c.JSON(http.StatusOK, config)
}

// UpdateConfigHandler 处理更新系统配置请求
func UpdateConfigHandler(c *gin.Context) {
	// 检查是否为管理员
	if !isOwner(c) {
		c.JSON(http.StatusForbidden, ConfigResponse{
			Success: false,
			Error:   "无权限访问",
		})
		return
	}

	// 获取提交的配置
	var config models.SystemConfig
	if err := c.ShouldBindJSON(&config); err != nil {
		c.JSON(http.StatusBadRequest, ConfigResponse{
			Success: false,
			Error:   "无效的配置数据",
		})
		return
	}

	// 检查配置服务
	if configService == nil {
		c.JSON(http.StatusInternalServerError, ConfigResponse{
			Success: false,
			Error:   "配置服务未初始化",
		})
		return
	}

	// 保存配置
	if err := configService.UpdateConfig(config); err != nil {
		c.JSON(http.StatusInternalServerError, ConfigResponse{
			Success: false,
			Error:   "保存配置失败: " + err.Error(),
		})
		return
	}

	c.JSON(http.StatusOK, ConfigResponse{
		Success: true,
	})
}

// GetSystemConfig 获取当前系统配置，供其他处理程序使用
func GetSystemConfig() models.SystemConfig {
	if configService == nil {
		return models.DefaultSystemConfig()
	}
	return configService.GetConfig()
}

// isOwner 检查当前用户是否为管理员
func isOwner(c *gin.Context) bool {
	// 从上下文中获取用户信息
	encryptedHeader := c.GetHeader("X-User-Info")

	if encryptedHeader == "" {
		return false
	}

	userInfo, err := models.DecryptUserInfo(encryptedHeader, encryptionKey)
	if err != nil {
		return false
	}

	return userInfo.IsOwner
}
